/**
 * 文件名：@SimpleStackHolder.java <br/>
 * 包名：cn.efunbox.afw.core.holder <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.holder;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 类名：SimpleStackHolder  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2016年7月31日 下午2:17:16  <br />
 * @version 2016年7月31日
 */
public class SimpleStackHolder<E> extends ThreadInternalHolder<Deque<E>> implements StackHolder<E> {

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 下午2:17:57<br/>
	 * 
	 * @param e <br/>
	 * @see cn.efunbox.afw.core.holder.StackHolder#push(java.lang.Object)
	 */
	@Override
	public void push(E e) {
		Deque<E> deque = get();
		
		if (null == deque) {
			set(deque = createStack());
		}
		
		deque.push(e);
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 下午2:17:57<br/>
	 * 
	 * @return <br/>
	 * @see cn.efunbox.afw.core.holder.StackHolder#pop()
	 */
	@Override
	public E pop() {
		Deque<E> deque = get();
		
		if (null == deque || deque.isEmpty()) {
			return null;
		}
		
		return deque.pop();
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 下午2:17:57<br/>
	 * 
	 * @return <br/>
	 * @see cn.efunbox.afw.core.holder.StackHolder#pick()
	 */
	@Override
	public E pick() {
		Deque<E> deque = get();
		
		if (null == deque || deque.isEmpty()) {
			return null;
		}
		
		return deque.getFirst();
	}

	/**
	 * 功能：方便子类提供deque实现 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月31日 下午2:19:35 <br/>
	 */
	protected Deque<E> createStack() {
		return new LinkedList<>();
	}
}
